#include <my_header.h>
// 若执行两次2号信号 第一次2号信号会执行 在执行3号信号
// 3号信号会执行 第二次2号信号会被阻塞 等3号号信号执行完毕
// 回过头来执行2号信号 由于没有屏蔽3号信号 2号信号执行完
// 会退出
void func(int sig_val)
{
    printf("before : %d\n", sig_val);
    sleep(5);

    sigset_t set;
    sigemptyset(&set);
    sigpending(&set);
    //检查一个特定信号是否在信号集中。
    if(sigismember(&set, SIGQUIT))
    {
        printf("sigquit is pending \n");
    }
    // 两个信号集都有可能在
    if(sigismember(&set, SIGINT))
    {
        printf("sigint is pending\n");
    }
    // ...
    printf("after :%d\n", sig_val);
}
/* Usage: ./10_sigpending */
int main(void){                                  

    struct sigaction act, old_act;
    memset(&act, 0, sizeof(act));   // 清空信号处理结构体act的内容
    act.sa_handler = func; // 指向信号处理函数

    sigset_t set;  // 创建信号集
    sigemptyset(&set);  // 初始化信号集
    // 将所有的信号都添加到信号集 9好信号和19号除外
    sigfillset(&set);   

    act.sa_mask = set;  // 设置要阻塞信号时要添加的信号集
     // 为 SIGINT 信号设置信号处理函数 act，并保留旧的处理函数 old  
    sigaction(SIGINT, &act, &old_act);

    while(1);
    return 0;
}

#if 0
    sigpending函数用于检查当前进程的未决信号集，即那
些已经发送给进程但由于某种原因(通常是因为被阻塞)尚未
被处理的信号。这个函数可以用来确定哪些信号已经被产生
并等待处理，但尚未被当前进程捕获或忽略

#include <signal.h>
//examine pending signals
int sigpending(
sigset_t *set // 接收当前进程的未决信号集
);
//返回值:成功时返回0，失败返回-1
#endif
